import axios from 'axios'
import { stringify } from 'qs'
import store from '@/store'
import { message } from 'ant-design-vue'
const { VUE_APP_API, VUE_APP_ENV } = process.env

const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。'
}
// 创建 axios 实例
let instance = axios.create({ timeout: 20000, baseURL: VUE_APP_API })
// 设置post默认 Content-Type
instance.defaults.headers['Content-Type'] =
  'application/x-www-form-urlencoded;charset=utf-8'
instance.defaults.headers['token'] =
  VUE_APP_ENV === 'development'
    ? 'TGT-186-1d7MMP4tpnQVYP9eK6lVz64HztYllvrxNb5iXP7WeNB3LgN7EP-cas'
    : null
// 添加请求拦截器
instance.interceptors.request.use(
  config => {
    config.data = stringify(config.data)
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  response => {
    closeLoading()
    let { data } = response
    if (data instanceof Blob) {
      return response
    }
    if (!data.flag) {
      message.error(data.errMsg || '服务异常')
      return Promise.reject(data)
    } else {
      return data
    }
  },
  error => {
    closeLoading()
    let code = error.response && error.response.status
    if (code === undefined && error.message.includes('timeout')) {
      code = 504
    }
    message.error(codeMessage[code])
    return Promise.reject(error)
  }
)
// 开启&&计算loading
const loadingFn = config => {
  if (config) return
  // 启动loading
  store.commit('SET_SPINNING', true)
  // 计算loading数量
  store.commit('setSpinningcount', 1)
}
// 关闭&&计算loading
const closeLoading = () => {
  // 计算loading数量,当为0时隐藏loading
  store.commit('setSpinningcount', -1)
  if (store.state.spinningcount <= 0) {
    store.commit('SET_SPINNING', false)
  }
}
export default {
  // post请求
  post (url, params, config) {
    // 去除首尾空格
    for (var key in params) {
      if (params[key] && typeof params[key] === 'string') {
        params[key] = params[key].replace(/(^\s*)|(\s*$)/g, '')
      }
    }
    loadingFn(config)
    return instance.post(url, params, config)
  },
  // get请求
  get (url, params, config) {
    loadingFn(config)
    return instance.get(url, { params }, config)
  },
  // mock请求
  mock (url, params, config) {
    loadingFn(config)
    return axios.get(url).then(res => {
      store.commit('SET_SPINNING', false)
      return res.data
    })
  }
}
